/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.siteEncheres.client.utilisateur;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.TextBox;
import com.gwtext.client.widgets.MessageBox;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.form.Label;
import com.gwtext.client.widgets.form.TextField;
import com.gwtext.client.widgets.layout.HorizontalLayout;
import com.gwtext.client.widgets.layout.VerticalLayout;
import domain.Utilisateur;
import java.sql.Timestamp;
import org.siteEncheres.client.DoubleBox;

/**
 *
 * @author Francois
 */
public class IhmModifierProfil extends Panel {

    private Label lblNom = new Label("Nom");
    private Label lblPrenom = new Label("Prénom");
    private Label lblDateNaissance = new Label("Date de naissance");
    private Label lblRue = new Label("Adresse");
    private Label lblCodePostal = new Label("Code postal");
    private Label lblVille = new Label("Ville");
    private Label lblNumTel = new Label("Numéro de téléphone");
    private Label lblMail = new Label("E-mail");
    private Label lblMailVerif = new Label("Veuillez ressaisir votre e-mail");
    private Label lblLogin = new Label("Login");
    private Label lblAncienMdp = new Label("Ancien mot de passe");
    private Label lblMdp = new Label("Mot de passe");
    private Label lblMdpVerif = new Label("Veuillez ressaisir votre mot de passe");
    private Label lblUtilisateur = new Label();
    private RadioButton radioButMonsieur = new RadioButton("sexe", " Monsieur");
    private RadioButton radioButMadame = new RadioButton("sexe", " Madame");
    private TextBox txtNom = new TextBox();
    private TextBox txtPrenom = new TextBox();
    private ListBox listeDateJour = new ListBox();
    private ListBox listeDateMois = new ListBox();
    private ListBox listeDateAnnee = new ListBox();
    private TextBox txtRue = new TextBox();
    private DoubleBox txtCodePostal = new DoubleBox();
    private TextBox txtVille = new TextBox();
    private DoubleBox txtNumTel = new DoubleBox();
    private TextBox txtMail = new TextBox();
    private TextBox txtMailVerif = new TextBox();
    private TextBox txtLogin = new TextBox();
    private TextField txtAncienMdp = new TextField();
    private TextField txtMdp = new TextField();
    private TextField txtMdpVerif = new TextField();
    private Utilisateur u = null;
    private String ancienMdp;
    private int idUtilisateur;
    private Button btnEnregistrer = new Button("Enregistrer");
    final AsyncCallback callbackModifier = new AsyncCallback() {

        @Override
        public void onSuccess(Object result) {
            radioButMonsieur.setValue(true);
            txtNom.setText("");
            txtPrenom.setText("");
            listeDateJour.setItemSelected(0, true);
            listeDateMois.setItemSelected(0, true);
            listeDateAnnee.setItemSelected(0, true);
            txtRue.setText("");
            txtCodePostal.setText("");
            txtVille.setText("");
            txtNumTel.setText("");
            txtMail.setText("");
            txtMailVerif.setText("");
            txtLogin.setText("");
            txtAncienMdp.setValue("");
            txtMdp.setValue("");
            txtMdpVerif.setValue("");

            //TESTER SI MODIF UTILISATEUR EN COURS
            //removeFromParent();
            //RootPanel.get().add(new IhmIdentifierUtilisateur());
        }

        @Override
        public void onFailure(Throwable caught) {
            String exception = formaterException(caught.getMessage());
            MessageBox.alert(exception);
        }
    };
    final AsyncCallback callbackSetUtilisateurEnCours = new AsyncCallback() {

        @Override
        public void onSuccess(Object result) {
        }

        @Override
        public void onFailure(Throwable caught) {
            String exception = formaterException(caught.getMessage());
            MessageBox.alert(exception);
        }
    };
    final AsyncCallback<Utilisateur> callbackUtilisateurEnCours = new AsyncCallback<Utilisateur>() {

        @Override
        public void onSuccess(Utilisateur u) {
            //On remplit les champs avec les données actuelles de l utilisateur.
            idUtilisateur = u.getIdUtilisateur();
            if (u.getSexe() == 'M') {

                radioButMonsieur.setValue(true);
            } else {
                radioButMadame.setValue(true);
            }

            txtNom.setText(u.getNom());
            txtPrenom.setText(u.getPrenom());
            String[] split = u.getDateNaissance().toString().split(" ");
            String date[] = split[0].split("-");
            listeDateJour.setSelectedIndex(Integer.parseInt(date[2]));
            listeDateMois.setSelectedIndex(Integer.parseInt(date[1]));
            listeDateAnnee.setSelectedIndex(1994 - Integer.parseInt(date[0]) + 1);
            txtRue.setText(u.getRue());
            txtCodePostal.setText(u.getCodePostal());
            txtVille.setText(u.getVille());
            txtNumTel.setText(u.getTelephone());
            txtMail.setText(u.getEmail());
            txtLogin.setText(u.getLogin());
            ancienMdp = u.getMotDePasse();
        }

        @Override
        public void onFailure(Throwable caught) {
            String exception = formaterException(caught.getMessage());
            MessageBox.alert(exception);
        }
    };

    public IhmModifierProfil() {
        setBorder(false);
        setPaddings(10);
        setAutoScroll(true);
        setFrame(true);
        setLayout(new VerticalLayout(20));
        
        //////////// panel Sexe /////////////////
        Panel panelSexe = new Panel();
        panelSexe.setBorder(false);
        panelSexe.setLayout(new HorizontalLayout(20));
        radioButMonsieur.setValue(true);
        panelSexe.add(radioButMonsieur);
        panelSexe.add(radioButMadame);
        add(panelSexe);
        //////////////////////////////////////////////

        //////////// panel Nom Prenom /////////////////
        Panel panelNP = new Panel();
        panelNP.setBorder(false);
        panelNP.setLayout(new HorizontalLayout(20));

        Panel pNom = new Panel();
        pNom.setLayout(new VerticalLayout());
        pNom.add(lblNom);
        txtNom.setMaxLength(50);
        pNom.add(txtNom);

        Panel pPrenom = new Panel();
        pPrenom.setLayout(new VerticalLayout());
        pPrenom.add(lblPrenom);
        txtPrenom.setMaxLength(50);
        pPrenom.add(txtPrenom);

        panelNP.add(pNom);
        panelNP.add(pPrenom);
        add(panelNP);
        //////////////////////////////////////////////


        //////////// panel Date naissance /////////////////
        Panel panelDateNaiss = new Panel();
        panelDateNaiss.setBorder(false);
        panelDateNaiss.setLayout(new VerticalLayout());
        panelDateNaiss.add(lblDateNaissance);

        Panel panelListesDate = new Panel();
        panelListesDate.setBorder(false);
        panelListesDate.setLayout(new HorizontalLayout(20));

        listeDateJour.addItem("--Jour--");
        for (int i = 1; i <= 31; i++) {
            listeDateJour.addItem(Integer.toString(i));
        }

        listeDateMois.addItem("--Mois--");
        for (int i = 1; i <= 12; i++) {
            listeDateMois.addItem(Integer.toString(i));
        }

        listeDateAnnee.addItem("--Année--");
        for (int i = 1994; i >= 1900; i--) {
            listeDateAnnee.addItem(Integer.toString(i));
        }


        panelListesDate.add(listeDateJour);
        panelListesDate.add(listeDateMois);
        panelListesDate.add(listeDateAnnee);

        panelDateNaiss.add(panelListesDate);
        add(panelDateNaiss);
        //////////////////////////////////////////////

        //////////// panel Adresse /////////////////
        Panel panelAdresse = new Panel();
        panelAdresse.setBorder(false);
        panelAdresse.setLayout(new VerticalLayout());

        Panel panelRue = new Panel();
        panelRue.setLayout(new VerticalLayout());
        panelRue.add(lblRue);
        txtRue.setMaxLength(50);
        panelRue.add(txtRue);

        Panel panelCpVille = new Panel();
        panelCpVille.setLayout(new HorizontalLayout(20));

        Panel panelCp = new Panel();
        panelCp.setLayout(new VerticalLayout());
        panelCp.add(lblCodePostal);
        txtCodePostal.setMaxLength(5);
        panelCp.add(txtCodePostal);

        Panel panelVille = new Panel();
        panelVille.setLayout(new VerticalLayout());
        panelVille.add(lblVille);
        txtVille.setMaxLength(50);
        panelVille.add(txtVille);

        panelCpVille.add(panelCp);
        panelCpVille.add(panelVille);

        panelAdresse.add(panelRue);
        panelAdresse.add(panelCpVille);
        add(panelAdresse);
        //////////////////////////////////////////////

        //////////// panel telephone /////////////////
        Panel panelTel = new Panel();
        panelTel.setBorder(false);
        panelTel.setLayout(new VerticalLayout());

        panelTel.add(lblNumTel);
        txtNumTel.setMaxLength(10);
        panelTel.add(txtNumTel);
        add(panelTel);
        //////////////////////////////////////////////

        //////////// panel Mail /////////////////
        Panel panelMail = new Panel();
        panelMail.setBorder(false);
        panelMail.setLayout(new VerticalLayout());

        panelMail.add(lblMail);
        txtMail.setMaxLength(50);
        panelMail.add(txtMail);
        add(panelMail);
        //////////////////////////////////////////////

        //////////// panel Mail verif/////////////////
        Panel panelMailVerif = new Panel();
        panelMailVerif.setBorder(false);
        panelMailVerif.setLayout(new VerticalLayout());

        panelMailVerif.add(lblMailVerif);
        txtMailVerif.setMaxLength(50);
        panelMailVerif.add(txtMailVerif);
        add(panelMailVerif);
        //////////////////////////////////////////////

        //////////// panel Login/////////////////
        Panel panelLogin = new Panel();
        panelLogin.setBorder(false);
        panelLogin.setLayout(new VerticalLayout());

        panelLogin.add(lblLogin);
        txtLogin.setMaxLength(50);
        panelLogin.add(txtLogin);
        add(panelLogin);
        //////////////////////////////////////////////
        
        //////////// panel ancien Mdp /////////////////
        Panel panelAncienMdp = new Panel();
        panelAncienMdp.setBorder(false);
        panelAncienMdp.setLayout(new VerticalLayout());

        panelAncienMdp.add(lblAncienMdp);
        txtAncienMdp.setPassword(true);
        panelAncienMdp.add(txtAncienMdp);
        add(panelAncienMdp);
        //////////////////////////////////////////////

        //////////// panel Mdp /////////////////
        Panel panelMdp = new Panel();
        panelMdp.setBorder(false);
        panelMdp.setLayout(new VerticalLayout());

        panelMdp.add(lblMdp);
        txtMdp.setPassword(true);
        txtMdp.setMaxLength(50);
        panelMdp.add(txtMdp);
        add(panelMdp);
        //////////////////////////////////////////////

        //////////// panel Mdp verif /////////////////
        Panel panelMdpVerif = new Panel();
        panelMdpVerif.setBorder(false);
        panelMdpVerif.setLayout(new VerticalLayout());

        panelMdpVerif.add(lblMdpVerif);
        txtMdpVerif.setPassword(true);
        txtMdpVerif.setMaxLength(50);
        panelMdpVerif.add(txtMdpVerif);
        add(panelMdpVerif);
        //////////////////////////////////////////////

        add(btnEnregistrer);
        add(lblUtilisateur);
        
        getService().getUtilisateurEnCours(callbackUtilisateurEnCours);

        btnEnregistrer.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent w) {
                String jour = listeDateJour.getValue(listeDateJour.getSelectedIndex());
                String mois = listeDateMois.getValue(listeDateMois.getSelectedIndex());
                String annee = listeDateAnnee.getValue(listeDateAnnee.getSelectedIndex());

                //Si les champs obligatoires sont vides
                if (!verifChampsObligatoire()) {
                    MessageBox.alert("Les champs Email, Login et Mot de passe sont obligatoires.\nVeuillez les renseignés.");

                } //Si le mail est different du mail de verification
                else if (txtMail.getText().compareTo(txtMailVerif.getText()) != 0) {
                    MessageBox.alert("Les 2 mails sont différents.\nVeuillez les ressaisir.");
                    txtMail.setText("");
                    txtMailVerif.setText("");
                    txtMdp.setValue("");
                    txtMdpVerif.setValue("");
                } //Si le mot de passe est different de l'ancien mot de passe
                else if (txtAncienMdp.getText().compareTo(ancienMdp) != 0) {
                    MessageBox.alert("L'ancien mot de passe est faux.\nVeuillez le ressaisir.");
                    txtAncienMdp.setValue("");
                    txtMdp.setValue("");
                    txtMdpVerif.setValue("");
                } //Si le mot de passe est different du mot de passe de verification
                else if (txtMdp.getText().compareTo(txtMdpVerif.getText()) != 0) {
                    MessageBox.alert("Les 2 Mots de passe sont différents.\nVeuillez les ressaisir.");
                    txtAncienMdp.setValue("");
                    txtMdp.setValue("");
                    txtMdpVerif.setValue("");
                } else {
                    u = new Utilisateur();
                    u.setIdUtilisateur(idUtilisateur);
                    if (radioButMonsieur.getValue()) {
                        u.setSexe('M');
                    } else {
                        u.setSexe('F');
                    }
                    u.setNom(txtNom.getText());
                    u.setPrenom(txtPrenom.getText());
                    Timestamp dateNaissance = Timestamp.valueOf(annee + "-" + mois + "-" + jour + " 00:00:00");
                    u.setDateNaissance(dateNaissance);
                    u.setRue(txtRue.getText());
                    u.setCodePostal(txtCodePostal.getText());
                    u.setVille(txtVille.getText());
                    u.setTelephone(txtNumTel.getText());
                    u.setEmail(txtMail.getText());
                    u.setLogin(txtLogin.getText());
                    u.setMotDePasse(txtMdp.getText());
                    //On modifie les donnees de l utilisateur par les nouvelles.
                    getService().modifierProfilUtilisateur(u, callbackModifier);
                    //On modifie les donnes de l utilisateur actuel.
                    getService().setUtilisateurEnCours(u, callbackSetUtilisateurEnCours);
                }
            }
        });
    }

    public static GwtUtilisateurAsync getService() {
        return GWT.create(GwtUtilisateur.class);
    }

    /**
     * 
     * @return vrai si les champs obligatoires ont ete remplis, faux sinon.
     */
    public boolean verifChampsObligatoire() {
        if (txtLogin.getText().compareTo("") == 0) {
            return false;
        }
        if (txtMail.getText().compareTo("") == 0) {
            return false;
        }
        if (txtMdp.getText().compareTo("") == 0) {
            return false;
        }
        return true;
    }
    
    /**
     * Méthode servant a separer le "java.lang.Exception:" du
     * message de l'exception qu on ne veut pas a l affichage.
     * 
     * @param exception Message contenu dans l exception.
     * @return ce qu il y a apres le "java.lang.Exception"
     * si cette chaine est presente, le message en entier sinon.
     */
    public String formaterException(String exception){
        String[] split = exception.split(":");
        if(split[0].compareTo("java.lang.Exception") == 0){
            return split[1];
        }
        else return exception;
    }
}
